package uy.org.softtech.cssuite.repositorios;

import java.util.Set;

import uy.org.softtech.cssuite.entidad.usuario.Usuario;
import uy.org.softtech.cssuite.excepciones.EntidadNoActualizadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoCreadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;

/**
 * Interfaz por medio de la cual se acceden a los datos de los usuarios en la base de datos.
 * 
 * @author fabian.lobo
 */
public interface RepositorioUsuarios {

	/**
	 * Busca un usuario en la base de datos por su correo electronico como identificador de usuario
	 * 
	 * @param email - Dirección de correo electrónico del usuario.
	 * @return el usuario relacionado al correo electrónico dado.
	 * @throws EntidadNoEncontradaException si no se encuentra ningún registro con los datos proporcionados.
	 * @author fabian.lobo
	 */
	Usuario buscarUsuarioPorEmail(String email) throws EntidadNoEncontradaException;

	/**
	 * Actualiza los datos del usuario en la base de datos
	 * 
	 * @param usuario - Usuario con los datos a actualizar
	 * @param servicio - Nombre del servicio en donde se actualizan los datos
	 * @return el usuario actualizado
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos en la base de datos.
	 * @author fabian.lobo
	 */
	Usuario actualizar(Usuario usuario, String servicio) throws EntidadNoActualizadaException;

	/**
	 * Busca un usuario en la base de datos por su identificador
	 * 
	 * @param id - Identificador del usuario.
	 * @return el usuario relacionado al identificador dado.
	 * @throws EntidadNoEncontradaException si no se encuentra ningún registro con los datos proporcionados.
	 * @author fabian.lobo
	 */
	Usuario buscar(Long id) throws EntidadNoEncontradaException;

	/**
	 * Retorna una lista con informacion de los usuarios registrados en la aplicación
	 * 
	 * @author fabian.lobo
	 */
	Set<Usuario> listarUsuarios();

	/**
	 * Almacena los datos del nuevo usuario en la base de datos
	 * 
	 * @param usuario - Usuario con los datos a almacenar
	 * @param servicio - Nombre del servicio en donde se almacenan los datos
	 * @return el usuario almacenado
	 * @throws EntidadNoCreadaException si no se pueden almacenar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Usuario crear(Usuario usuario, String servicio) throws EntidadNoCreadaException;
}
